home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Chans / 822-local / ckmf.c next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  5.4 KB  |  304 lines

  1. /* chkmf.c: check local delivery file stuff */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Chans/822-local/RCS/ckmf.c,v 6.0 1991/12/18 20:04:31 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Chans/822-local/RCS/ckmf.c,v 6.0 1991/12/18 20:04:31 jpo Rel $
  9.  *
  10.  * $Log: ckmf.c,v $
  11.  * Revision 6.0  1991/12/18  20:04:31  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "util.h"
  19. #include <varargs.h>
  20. #include "expand.h"
  21. #include "retcode.h"
  22. #include <sys/stat.h>
  23. #include <pwd.h>
  24. #include <isode/tailor.h>    /* getlocalhost defn */
  25.  
  26. #define PROTMODE    (0022)
  27.  
  28. #define MAXVARS 100
  29. Expand    variables[MAXVARS];
  30. int    nvars;
  31. static int fakeuserid;
  32. static int change_user = 0;
  33.  
  34. char    *myname;
  35. extern int debug, yydebug;
  36. void    adios (), advise ();
  37.  
  38. main (argc, argv)
  39. int    argc;
  40. char    **argv;
  41. {
  42.     extern char    *optarg;
  43.     extern int    optind;
  44.     extern FILE    *yyin;
  45.     int    opt;
  46.     int    n;
  47.     char    msg_size[20];
  48.     struct stat st;
  49.  
  50.     myname = argv[0];
  51.     while((opt = getopt(argc, argv, "du:i:")) != EOF)
  52.         switch (opt) {
  53.             case 'd':
  54.             yydebug = debug = 1;
  55.             break;
  56.  
  57.             case 'u':
  58.             {
  59.                 struct passwd *pwd;
  60.  
  61.                 if ((pwd = getpwnam (optarg)) == NULL) {
  62.                     fprintf (stderr,
  63.                          "Unknown user name %s",
  64.                          optarg);
  65.                     exit (1);
  66.                 }
  67.                 fakeuserid = pwd -> pw_uid;
  68.                 change_user = 1;
  69.             }
  70.             break;
  71.             case 'i':
  72.             fakeuserid = atoi(optarg);
  73.             change_user = 1;
  74.             break;
  75.  
  76.             default:
  77.             fprintf (stderr, "Usage: %s [-d] mailfilter\n",
  78.                  myname);
  79.             break;
  80.         }
  81.     argc -= optind;
  82.     argv += optind;
  83.     if (change_user)
  84.         do_the_change (fakeuserid);
  85.  
  86.     if (argc != 1)
  87.         adios (NULLCP, "Usage: %s [-d] mailfilter", myname);
  88.     if ((yyin = fopen (argv[0], "r")) == NULL)
  89.         adios (argv[0], "Can't open file");
  90.     if (fstat (fileno (yyin), &st) == NOTOK)
  91.         adios (argv[0], "Can't fstat file");
  92.     if (st.st_mode & PROTMODE) {
  93.         fprintf (stderr, "File %s has wrong mode (%o)\n",
  94.              argv[0], st.st_mode & 0777);
  95.         fprintf (stderr,
  96.              "Should not have group or general write permission\n");
  97.     }
  98.         
  99.     initialise ();
  100.  
  101.     yyparse();
  102.  
  103.     if (fstat (0, &st) == -1)
  104.         (void) strcpy (msg_size, "???");
  105.     else    (void) sprintf (msg_size, "%d", st.st_size);
  106.  
  107.     n = 0;
  108.     variables[n].macro = strdup("size");
  109.     variables[n].expansion = strdup (msg_size);
  110.     create_var (&variables[n]);
  111.     n++;
  112.  
  113.     variables[n].macro = strdup ("return-path");
  114.     variables[n].expansion = strdup ("sender@remote");
  115.     create_var (&variables[n]);
  116.     n++;
  117.  
  118.     variables[n].macro = strdup ("mailbox");
  119.     variables[n].expansion = strdup ("themailbox");
  120.     create_var (&variables[n]);
  121.     n++;
  122.  
  123.     variables[n].macro = strdup ("recipient");
  124.     variables[n].expansion = strdup ("therecipient");
  125.     create_var (&variables[n]);
  126.     n++;
  127.  
  128.     variables[n].macro = strdup ("userid");
  129.     if (getenv ("USER"))
  130.         variables[n].expansion = strdup (getenv("USER"));
  131.     else {
  132.         (void) sprintf (msg_size, "%d", getuid ());
  133.         variables[n].expansion = strdup (msg_size);
  134.     }
  135.     create_var (&variables[n]);
  136.     n ++;
  137.  
  138.     (void) sprintf (msg_size, "%d", getgid ());
  139.     variables[n].macro = strdup ("groupid");
  140.     variables[n].expansion = strdup (msg_size);
  141.     create_var (&variables[n]);
  142.     n ++;
  143.  
  144.     variables[n].macro = strdup ("channelname");
  145.     variables[n].expansion = strdup ("thechannel");
  146.     create_var (&variables[n]);
  147.     n++;
  148.  
  149.     variables[n].macro = strdup ("hostname");
  150.     variables[n].expansion = strdup (getlocalhost ());
  151.     create_var (&variables[n]);
  152.     n ++;
  153.     
  154.  
  155.     nvars = parse_hdr (0, variables + 3, MAXVARS - 3) + 3;
  156.  
  157.     switch (run ()) {
  158.         case RP_OK:
  159.         printf ("Result: delivered OK\n");
  160.         break;
  161.         case RP_BAD:
  162.         printf ("Result: delivery failed (permanently)\n");
  163.         break;
  164.         case RP_AGN:
  165.         printf ("Result: delivered failed (temporarily)\n");
  166.         break;
  167.         case RP_NOOP:
  168.         printf ("Result: no delivery - other methods will be tried\n");
  169.         break;
  170.         default:
  171.         printf ("Result: Dunno!\n");
  172.         break;
  173.     }
  174.  
  175.     exit (0);
  176.     /* NOTREACHED */
  177. }
  178.  
  179. do_the_change (id)
  180. int    id;
  181. {
  182.     int myuid = getuid ();
  183.     struct passwd *pwd;
  184.     extern char *pplogin;
  185.  
  186.     pwd = getpwnam (pplogin);
  187.     if (myuid == 0 ||
  188.         (pwd && myuid == pwd -> pw_uid)) {
  189. #ifdef BSD42
  190.         if (setreuid (id, id) == NOTOK)
  191. #else
  192.         if (setuid (id) == NOTOK)
  193. #endif
  194.             adios ("setreuid", "Can't set ids to %d", id);
  195.     }
  196.     else
  197.         adios (NULLCP, "Not running as root or PP");
  198. }
  199.  
  200.  
  201. #ifndef    lint
  202. static void    _advise ();
  203.  
  204.  
  205. void    adios (va_alist)
  206. va_dcl
  207. {
  208.     va_list ap;
  209.  
  210.     va_start (ap);
  211.  
  212.     _advise (ap);
  213.  
  214.     va_end (ap);
  215.  
  216.     _exit (1);
  217. }
  218. #else
  219. /* VARARGS */
  220.  
  221. void    adios (what, fmt)
  222. char   *what,
  223.        *fmt;
  224. {
  225.     adios (what, fmt);
  226. }
  227. #endif
  228.  
  229.  
  230. #ifndef    lint
  231. void    advise (va_alist)
  232. va_dcl
  233. {
  234.     va_list ap;
  235.  
  236.     va_start (ap);
  237.  
  238.     _advise (ap);
  239.  
  240.     va_end (ap);
  241. }
  242.  
  243.  
  244. static void  _advise (ap)
  245. va_list    ap;
  246. {
  247.     char    buffer[BUFSIZ];
  248.  
  249.     asprintf (buffer, ap);
  250.  
  251.     (void) fflush (stdout);
  252.  
  253.     fprintf (stderr, "%s: ", myname);
  254.     (void) fputs (buffer, stderr);
  255.     (void) fputc ('\n', stderr);
  256.  
  257.     (void) fflush (stderr);
  258. }
  259. #else
  260. /* VARARGS */
  261.  
  262. void    advise (what, fmt)
  263. char   *what,
  264.        *fmt;
  265. {
  266.     advise (what, fmt);
  267. }
  268. #endif
  269.  
  270. putunixfile (str)
  271. char    *str;
  272. {
  273.     char    buf[BUFSIZ];
  274.     expand (buf, str, variables);
  275.     printf ("append to file (sendmail format) '%s'\n", buf);
  276.     return RP_OK;
  277. }
  278.  
  279. putfile (str)
  280. char    *str;
  281. {
  282.     char    buf[BUFSIZ];
  283.     expand (buf, str, variables);
  284.     printf ("append to file '%s'\n", buf);
  285.     return RP_OK;
  286. }
  287.  
  288. putpipe (str)
  289. char    *str;
  290. {
  291.     char    buf[BUFSIZ];
  292.  
  293.     install_vars (variables, nvars, MAXVARS);
  294.     expand (buf, str, variables);
  295.     printf ("pipe into process '%s'\n", buf);
  296.     return RP_OK;
  297. }
  298.  
  299. printit (s)
  300. char    *s;
  301. {
  302.     fputs (s, stdout);
  303. }
  304.